package Leetcode;

/**
 * @ Author     ：侯耀祖
 * @ Description：
 */
public class quickSort {

    /**
     * 对数组进行快速排序
     * @param arr 待排序的数组
     */
    public void quickSort(int[] arr){
        if (arr == null || arr.length <= 1)
            return;
        sort(arr, 0, arr.length - 1);
    }

    public int partition(int[] arr, int low, int high){
        int pivot = arr[high];
        int i = low;
        for (int j = low; j < high; j++) {
            if (arr[j] <= pivot) {
                swap(arr, i, j); // 将小于pivot的元素交换到左侧
                i++;
            }
        }
        swap(arr, i, high);
        return i;
    }

    /**
     * 交换数组中的两个元素
     * @param arr 待操作的数组
     * @param i 第一个元素的索引
     * @param j 第二个元素的索引
     */
    public void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    /**
     * 快速排序的递归实现
     * @param arr 待排序的数组
     * @param low 排序的起始索引
     * @param high 排序的结束索引
     */
    public void sort(int[] arr, int low, int high){
        if (low >= high){
            return;
        }
        int pivotIndex = partition(arr, low, high);
        sort(arr, low, pivotIndex - 1);  // 递归左子数组
        sort(arr, pivotIndex + 1, high); // 递归右子数组
    }
}
